/**
 * 在线用户服务实现类
 */
package com.jeeplus.test.onetest.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jeeplus.common.redis.RedisUtils;
import com.jeeplus.sys.constant.CacheNames;
import com.jeeplus.sys.service.dto.UserDTO;
import com.jeeplus.sys.utils.UserUtils;
import com.jeeplus.test.onetest.domain.OnlineUser;
import com.jeeplus.test.onetest.mapper.OnlineUserMapper;
import com.jeeplus.test.onetest.service.OnlineUserService;
import com.jeeplus.test.onetest.service.dto.OnlineUserDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 在线用户服务实现类
 * @author jeeplus
 */
@Service
@Transactional
public class OnlineUserServiceImpl extends ServiceImpl<OnlineUserMapper, OnlineUser> implements OnlineUserService {
    
    @Override
    public List<OnlineUserDTO> getOnlineUserList() {
        List<OnlineUserDTO> onlineUserList = new ArrayList<>();
        
        // 从Redis中获取所有用户会话token
        Set<String> keys = RedisUtils.getInstance().keys(CacheNames.USER_CACHE_TOKEN + "*");
        
        if (keys != null && !keys.isEmpty()) {
            for (String key : keys) {
                // 提取登录名
                String loginName = extractLoginNameFromKey(key);
                if (StrUtil.isNotEmpty(loginName)) {
                    // 获取用户信息
                    UserDTO userDTO = UserUtils.getByLoginName(loginName);
                    if (userDTO != null) {
                        OnlineUserDTO onlineUserDTO = new OnlineUserDTO();
                        BeanUtils.copyProperties(userDTO, onlineUserDTO);
                        onlineUserDTO.setUserId(userDTO.getId());
                        onlineUserDTO.setLoginName(userDTO.getLoginName());
                        onlineUserDTO.setUsername(userDTO.getName());
                        onlineUserDTO.setLoginTime(userDTO.getLoginDate());
                        onlineUserDTO.setLastActiveTime(new Date());
                        
                        onlineUserList.add(onlineUserDTO);
                    }
                }
            }
        }
        
        return onlineUserList;
    }
    
    @Override
    public int getOnlineUserCount() {
        // 从Redis中获取所有用户会话token并统计数量
        Set<String> keys = RedisUtils.getInstance().keys(CacheNames.USER_CACHE_TOKEN + "*");
        return keys != null ? keys.size() : 0;
    }
    
    @Override
    public OnlineUserDTO getOnlineUserByUserId(String userId) {
        // 根据用户ID获取用户信息
        UserDTO userDTO = UserUtils.getByLoginName(userId);
        if (userDTO != null) {
            // 检查用户是否在线
            Set<String> keys = RedisUtils.getInstance().keys(CacheNames.USER_CACHE_TOKEN + userDTO.getLoginName() + "*");
            if (keys != null && !keys.isEmpty()) {
                OnlineUserDTO onlineUserDTO = new OnlineUserDTO();
                BeanUtils.copyProperties(userDTO, onlineUserDTO);
                onlineUserDTO.setUserId(userDTO.getId());
                onlineUserDTO.setLoginName(userDTO.getLoginName());
                onlineUserDTO.setUsername(userDTO.getName());
                onlineUserDTO.setLoginTime(userDTO.getLoginDate());
                onlineUserDTO.setLastActiveTime(new Date());
                
                return onlineUserDTO;
            }
        }
        return null;
    }
    
    @Override
    public void addOnlineUser(OnlineUserDTO onlineUserDTO) {
        // 这里主要是基于Redis的会话管理，不需要额外添加到数据库
        // 如果需要持久化，可以在这里添加数据库操作
    }
    
    @Override
    public void updateOnlineUser(OnlineUserDTO onlineUserDTO) {
        // 更新用户最后活跃时间
        // 实际应用中可以通过拦截器来更新用户的活跃时间
    }
    
    @Override
    public void removeOnlineUser(String userId) {
        // 根据用户ID获取用户信息
        UserDTO userDTO = UserUtils.getByLoginName(userId);
        if (userDTO != null) {
            // 删除用户的所有会话token
            Set<String> keys = RedisUtils.getInstance().keys(CacheNames.USER_CACHE_TOKEN + userDTO.getLoginName() + "*");
            if (keys != null && !keys.isEmpty()) {
                RedisUtils.getInstance().delete(keys);
            }
        }
    }
    
    /**
     * 从Redis的key中提取登录名
     * @param key Redis的key
     * @return 登录名
     */
    private String extractLoginNameFromKey(String key) {
        if (StrUtil.isEmpty(key) || !key.startsWith(CacheNames.USER_CACHE_TOKEN)) {
            return null;
        }
        
        // 去除前缀
        String remaining = key.substring(CacheNames.USER_CACHE_TOKEN.length());
        // 提取登录名（假设格式为：loginName:token）
        int index = remaining.indexOf(":");
        if (index > 0) {
            return remaining.substring(0, index);
        }
        
        return null;
    }
}